let myTuple :[number, number] = [1, 5]; //定义元组类型，元组类型允许为每个元素指定不同的类型。
console.log(myTuple);//[1, 5]
console.log(myTuple[0]);//1

myTuple.push(2);//添加元素
console.log(myTuple);// [1, 5, 2]

myTuple.pop();//删除最后一个元素
console.log(myTuple);//[1, 5]

myTuple[0] = 10;//修改元组元素
console.log(myTuple);//[10, 5]

let [x, y] = myTuple;// 解构元组
console.log(x, y);// 10 5

//TypeScript 还允许为元组中的每个元素添加标签，这使得元组的含义更加清晰：
let tagTuple:[id: number, name: string] = [1, 'John'];// 元组类型可以指定每个元素的
console.log(tagTuple);//[1, 'John']

let tuple: [number, string] = [1, 'John'] as const;// as const 表示将数组声明为只读数组，并指定每个元素的类型。
let tuple0:readonly [ number, string ] = [2, 'Json'] as readonly [number, string];// readonly 表示数组为只读数组。
console.log(tuple, tuple0);// [1, 'John'] [2, 'Json']

// 元组可以使用数组的 concat 方法进行连接，但需要注意连接后的结果是一个普通的数组，而不是元组。
let tuple2 = [1, 'John'];
let tuple3 = [2, 'Alice'];
console.log(tuple2.concat(tuple3));//[1, 'John', 2, 'Alice']

// 遍历元组
for( let item of myTuple) {
    console.log(item);
}
// 遍历元组
myTuple.forEach(item => {
    console.log(item);
});

// 元组可以进行 slice 操作，返回一个新的元组，其中包含从指定索引开始的元素。
let tupleSliced: [number, string, boolean] = [1, 'John', true];
console.log(tupleSliced.slice(1));// ['John', true]

// 元组可以转换为数组，但需要注意转换后的结果是一个普通的数组，而不是元组。
let arrFrom = Array.from(tupleSliced);
arrFrom.push(false);
console.log(arrFrom);// [1, 'John', true, false]

// 元组可以进行扩展操作，将多个元组合并为一个元组。
let extendTuple : [ ...( number | string )[] ] = [ ...tuple2, ...tuple3 ];
console.log(extendTuple);// [1, 'John', 2, 'Alice']